home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Texteditors / XDME / Src / Key / KeyControl.c < prev    next >
C/C++ Source or Header  |  1996-09-26  |  8KB  |  308 lines

  1. /******************************************************************************
  2.  
  3.     MODUL
  4.     keycontrol.c
  5.  
  6.     DESCRIPTION
  7.     interface for keyboard control from main
  8.     Handle keyboard related stuff such as keyboard mappings. Every
  9.     time a key is pressed, KEYCTL() is called with the code. KEYCTL()
  10.     remembers which qualifier keys are currently held down, and when a
  11.     non-qualifier key is pressed finds the hash entry for the key.    If
  12.     no hash entry exists (e.g. you type a normal 'a') the default
  13.     keymap is used.
  14.  
  15.     NOTES
  16.     Amiga-specific & [X]DME-specific
  17.     depends on macro-language
  18.  
  19.     BUGS
  20.  
  21.     TODO
  22.     we might enable deadkeys on our own - shall we do this ?
  23.         that would be done with a command redefining a
  24.         variable that is used instead of NO_KEYS_PRESSED
  25.  
  26.     EXAMPLES
  27.  
  28.     SEE ALSO
  29.  
  30.     INDEX
  31.  
  32.     HISTORY
  33.     15-Dez-92  b_null created
  34.     16-Dez-92  b_null documented
  35.     $Date: 94/07/06 12:06:48 $ last update
  36.  
  37. ******************************************************************************/
  38.  
  39. /**************************************
  40.         Includes
  41. **************************************/
  42. #define  KEY_INTERNAL
  43. #include "defs.h"
  44.  
  45.  
  46. /**************************************
  47.         Globale Variable
  48. **************************************/
  49. Prototype void keyctl (struct IntuiMessage *, int, ULONG);  /* PATCH_NULL [14 Feb 1993] : changed to void */
  50.  
  51.  
  52. /**************************************
  53.       Interne Defines & Strukturen
  54. **************************************/
  55. #define NO_KEYS_PRESSED 0x00000000  /* we might write 0C0? for accents */
  56.  
  57. /* some hardcoded keys on Amiga Keyboard - look also in keycodes */
  58. #define CSPC  0x40
  59. #define CB_S  0x41 /* always ? */
  60. #define CENT  0x43
  61. #define CRET  0x44
  62.  
  63.  
  64. /**************************************
  65.         Interne Variable
  66. **************************************/
  67. /* nothing */
  68.  
  69. /**************************************
  70.        Interne Prototypes
  71. **************************************/
  72.  
  73.  
  74. /*****************************************************************************
  75.  
  76.     NAME
  77.     keyctl
  78.  
  79.     PARAMETER
  80.     struct IntuiMessage *    im
  81.     int            code
  82.     ULONG            qual
  83.  
  84.     RESULT
  85.     -/-
  86.  
  87.     RETURN
  88.     void
  89.  
  90.     DESCRIPTION
  91.     reaction on a key-information
  92.  
  93.     NOTES
  94.  
  95.     BUGS
  96.  
  97.     EXAMPLES
  98.  
  99.     SEE ALSO
  100.  
  101.     INTERNALS
  102.     erzeuge die mit der msg verbundenen keycodes
  103.     und qualifiers
  104.     suche dann nach einer map dafuer
  105.     //falls es keine gab, benutze wenn moeglich die
  106.     //system-belegung als macro
  107.  
  108.     HISTORY
  109.     15-Dez-92  b_null moved here & modified
  110.     16.Dez.92  b_null documented
  111.     28.Dez.92  b_null added support for NO dead-keys
  112.     27-06-94   b_null debugged - what a hack... =8-(
  113.  
  114. ******************************************************************************/
  115.  
  116. void keyctl (struct IntuiMessage * im, int code, ULONG qual)
  117. {
  118. /* PATCH_DEAD 28-Dez-92 : this is the boolean flag for disabling Deadkeys, */
  119. /*              if the last non-"up"-key initiated a macrocall   */
  120.     static  WORD  last_displayed = 0;
  121. /* PATCH_DEAD 28-Dez-92 */
  122.         UBYTE  buf[LINE_LENGTH];
  123.         UWORD  c2;
  124.         WORD   blen = 0;
  125.         int    ext2;
  126. /* static int id=0; */
  127.  
  128.     code &= 0xFF;            /* shorten code to one byte */
  129.  
  130. /* ++id; */
  131. /* printf ("\n[%04x] LD=%d iaddr %08lx->%08lx (A)\n", id, last_displayed, (im)?im->IAddress:NULL, (im)? *(long*)im->IAddress: 0L); */
  132.  
  133.  
  134. #if defined(PATCH_FILTER)
  135. /*
  136. **  --- Before executing the keystroke,
  137. **    check if a filter is active and if the key can pass the filter
  138. */
  139.     if ((key_filter != 0) && (filter_key (code) != 0)) {
  140.     return;
  141.     } /* if */
  142. #endif /* PATCH_FILTER */
  143.  
  144.  
  145. /*
  146. **  --- Before evaluating the key's Qualifiers,
  147. **    append the extended Qualifiers to the pressed ones
  148. */
  149.     ext2 =  ext_qualifiers;
  150.     qual = (qual & 0xF000FFFF) | ext2;
  151.  
  152.     if (im) {
  153.     UWORD oldQual = im->Qualifier;
  154.  
  155. /* PATCH_DEAD 28-Dez-92 : if necessary hide the last pressed keys */
  156.     long  dummy_prev[1];
  157.     long * inter_iaddr = im->IAddress;
  158.  
  159.     if (last_displayed) {
  160.         dummy_prev[0]  = NO_KEYS_PRESSED;
  161.         im->IAddress   = dummy_prev;
  162.         if (!(code & 0x80)) {   /* PATCH_NULL [14 Feb 1993] : added to come around with additional msges for -UP keys */
  163.         last_displayed = 0;
  164.         } /* if no up-msg */
  165.      /* last_displayed = 0; */
  166.     } /* if */
  167. /* PATCH_DEAD 28-Dez-92 */
  168.  
  169.     im->Qualifier = (oldQual & ~IEQUALIFIER_REPEAT) | (0xFFFF & ext2);  /* == ... & 0xF000FFFF | ext2 -> === qual ohne extended */
  170.  
  171. /* printf ("[%04x] LD=%d iaddr %08lx->%08lx code/qual %04x/%04x (E)\n", id, last_displayed, im->IAddress, *((long*)im->IAddress), im->Code, im->Qualifier); */
  172.  
  173.     blen = DeadKeyConvert (im, buf+1, 254, NULL);
  174.     im->Qualifier = oldQual;
  175.  
  176. /* PATCH_DEAD 28-Dez-92: restore the old value (that is obsolete, since we are using a copy of im, but...)*/
  177.     im->IAddress = inter_iaddr;
  178. /* PATCH_DEAD 28-Dez-92 */
  179.  
  180.     if (blen < 0) {
  181.         return;
  182.     } else if (blen == 1) {
  183.         buf[0] = '\'';
  184.         buf[2] = 0;
  185.     } else if (blen) {
  186.         buf[0] = '`';
  187.         buf[blen+1] = '\'';
  188.     } else {
  189.         buf[0] = 0;
  190.         buf[1] = 0;
  191.     } /* if */
  192.     }
  193.     ext_qualifiers = 0;
  194.  
  195.     c2 = iqual2qual (qual, blen, buf, code);
  196.     code &= 0x7f;                /* Remove the up/down information AFTER iqual2qual */
  197.  
  198. /* printf ("key : %lx %x %s (blen=%d,buf=%c)\n", c2, code, cqtoa(code,c2), blen,buf[1]); */
  199.  
  200.     {
  201.     HASH * hash;
  202.     struct keyspec ks;
  203.  
  204.     ks.ks_code     = code;
  205.     ks.ks_qualifiers = c2;
  206.     ks.ks_qualmask     = QUALMASK;
  207.  
  208. /* PATCH_NULL [13 Jan 1993] : the following construct was added for [X]DME only to allow deletion on returnoverride */
  209. #    ifdef NOT_DEF
  210.         /* that long version disables not only return but also backspace and space */
  211.         if (globalflags.Comlinemode && c2 == 0) {
  212.         char * str = NULL;
  213.         switch (code) {
  214.         case CRET: str = "return";  break;
  215.         case CSPC: str = "( )";     break;
  216.         case CB_S: str = "bs";      break;
  217.         } /* switch */
  218.         if (str) {
  219.             last_displayed = 1;
  220.             strcpy (buf, str);
  221.             do_command (buf);   /* PATCH_NULL [14 Feb 1993] : added */
  222.             return;
  223.         } /* if */
  224.         } /* if comline without quals */
  225. #    else
  226.         /* that short version only disables return */
  227.         if (globalflags.Comlinemode && code == CRET && c2 == 0) {
  228.         last_displayed = 1;
  229.         strcpy (buf, "return");
  230.         do_command (buf);       /* PATCH_NULL [14 Feb 1993] : added */
  231.         return;
  232.         } /* if */
  233. #    endif
  234. /* PATCH_NULL [13 Jan 1993] */
  235.  
  236.     hash = findhash (currenthash(), &ks, im? buf: NULL);
  237.  
  238.     /*
  239.      *  Use hash entry only if not in command line mode, or if the
  240.      *  entry does not correspond to an alpha key.
  241.      */
  242.  
  243.     if (hash) {
  244.         /*
  245.          * found hash-entry
  246.          * only use it, if we are not in commandline-mode
  247.          * or (if in comlinemode:) if a qualifier was pressed
  248.          *                   or it is a non-alphanum
  249.          */
  250.         if (c2 || !globalflags.Comlinemode || blen > 1 || !CtoA(code)) {
  251. /* PATCH_DEAD 28-Dez-92 : enable hiding of the last pressed keys */
  252.         if (im && *hash->comm) {
  253.             last_displayed = 1;
  254.         } /* if key from a message */
  255. /* PATCH_DEAD 28-Dez-92 */
  256.         strcpy (buf, hash->comm);
  257.         do_command (buf);   /* PATCH_NULL [14 Feb 1993] : added */
  258.         return;
  259.         } /* if  */
  260.     } /* if */
  261.     }
  262.  
  263.  
  264. #if 1 /* PATCH_NULL 27-06-94 .... the following code was thought obsolete since findhash manages unmapped keys - as long as comline is supported, it is not */
  265.  
  266.     /*
  267.      *    No hash entry
  268.      */
  269.  
  270.     if (blen > 0) {
  271. #if 0 /* the macro was already created immediately after RawKeyConvert */
  272.     /*
  273.      *  try to create a macro if we had a result on DeadKeyConvert
  274.      */
  275.     if (blen == 1) {
  276.         buf[0] = '\'';  /* This *MUST* be ' !!!! */
  277.         buf[2] = 0;
  278.     } else {
  279.         buf[0] = '`';
  280.         buf[blen+1] = '\'';
  281.     }
  282. #endif
  283. /*    last_displayed = 1; */    /* PATCH_DEAD 28-Dez-92 : it might be senseful to put it here, too ... */
  284.                 /* PATCH_DEAD 14-Jan-93 : ... but normally active keys are no deadkeys */
  285.     do_command (buf);       /* PATCH_NULL [14 Feb 1993] : added */
  286.     return;
  287. /*
  288. **  --- if there was no real reaction on that key
  289. **    restore the extended Qualifiers
  290. */
  291.     } else {
  292.     ext_qualifiers = ext2; /* keep the qualifiers */
  293. /* printf("nothing found w/ code %d,%d\n", code, c2); */
  294.     } /* if (no) string from DeadKeyConvert */
  295.  
  296. #else
  297.     ext_qualifiers = ext2;
  298. #endif
  299.  
  300. } /* keyctl */
  301.  
  302.  
  303.  
  304.  
  305. /******************************************************************************
  306. *****  ENDE keycontrol.c
  307. ******************************************************************************/
  308.